from django.shortcuts import render
import logging
'''
中间件本质就是装饰器，只不过被中间件装饰的是django中的试图函数
实现了对请求和响应的拦截和过滤，可以对请求和处理做额外处理
更常用的名字叫拦截过滤器（filter/）

'''

# 写日志
logger = logging.getLogger('django.request')

def exception_handle_middleware(view_func):

    # 拦截用户对请求做一些处理
    def wrapper(request, *args, **kwargs):
        '''
        对请求或者相应做拦截
        :param request:
        :param args:
        :param kwargs:
        :return:
        '''

        resp = view_func(request, *args, **kwargs)
        # 做相应的处理
        # 检测相应状态码是不是5XX ----> 服务器程序出问题
        # 2XX ----> 请求成功
        # 3XX  ---->重定向（给浏览器发送一个新的URL,让浏览器重新请求新的URL)
        # 4XX  ----> 请求有问题
        #     ~401 ----> NOT Found
        #     ~401  ---->Unau
        if str(resp.status_code).startswith('5'or'4'):
            # 生成一条日志记录这个错误以便通过追踪日志定位错误解决问题
            # 严重错误方法info/error/warring/critical，日志级别调用不同的方法
            logger.error(f'{request.path}:{view_func.__name__}:{resp.status_code}\n======')
            return render(request,'erro.html')
        return resp




    return wrapper
